CSSã¢ãŒã·ã§ã³ãã¹ã®åãæ¢æ±ããè€éã§èŠèŠçã«çŸããã¢ãã¡ãŒã·ã§ã³ãäœæããŸããããã«ã¹ã¿ã ãã¹ã®å®çŸ©ãèŠçŽ ã®åãã®å¶åŸ¡ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžæ¹æ³ãåŠã³ãŸãã
CSSã¢ãŒã·ã§ã³ãã¹ïŒè€éãªã¢ãã¡ãŒã·ã§ã³è»éãéæŸãã
åžžã«é²åãç¶ããWebéçºã®äžçã«ãããŠãé åçã§ãã€ãããã¯ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåµåºããããšã¯æãéèŠã§ããCSSã¢ãŒã·ã§ã³ãã¹ã¯åŒ·åãªããŒã«ãšããŠç»å Žããéçºè ã¯HTMLèŠçŽ ãã«ã¹ã¿ã å®çŸ©ããããã¹ã«æ²¿ã£ãŠåããããšãã§ããåçŽãªç·åœ¢ãã©ã³ãžã·ã§ã³ãè¶ ããæ°ããæ¬¡å ã®ã¢ãã¡ãŒã·ã§ã³ã®å¯èœæ§ãåãéããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãCSSã¢ãŒã·ã§ã³ãã¹ã®è€éããæãäžãããã®æ©èœãå®è£ æè¡ããããŠé åçãªWebã¢ãã¡ãŒã·ã§ã³ãäœæããããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢ããŸãã
CSSã¢ãŒã·ã§ã³ãã¹ãšã¯ïŒ
CSSã¢ãŒã·ã§ã³ãã¹ã¯ãéçºè ãHTMLèŠçŽ ãç¹å®ã®ãã¹ã«æ²¿ã£ãŠã¢ãã¡ãŒã·ã§ã³ãããããšãå¯èœã«ããŸãããã®ãã¹ã¯ãå®çŸ©æžã¿ã®åœ¢ç¶ãSVGãã¹ããããã¯CSSããããã£ã䜿çšããŠå®çŸ©ãããã«ã¹ã¿ã ãã¹ã«ããããšãã§ããŸããããã«ãããéç·åœ¢ã®è»éãæãè€éã§èŠèŠçã«é åçãªã¢ãã¡ãŒã·ã§ã³ãäœæããæãéããããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã匷åããããæ²¡å ¥æã®ããäœéšãæäŸããŸãã
keyframes
ã«ãã£ãŠå®çŸ©ãããç¶æ
éã®ãã©ã³ãžã·ã§ã³ã«äŸåããåŸæ¥ã®CSSã¢ãã¡ãŒã·ã§ã³ãšã¯ç°ãªããã¢ãŒã·ã§ã³ãã¹ã¯ãã¹ã«æ²¿ã£ãé£ç¶çã§æµãããããªåããå¯èœã«ããŸããããã«ãããçŸå®äžçã®ç©çæ³åãæš¡å£ããããèžè¡çãªãã¶ã€ã³ã«è¿œåŸãããããè€éãªã¢ãã¡ãŒã·ã§ã³ã®äœæãå¯èœã«ãªããŸãã
äž»èŠãªæŠå¿µãšããããã£
CSSã¢ãŒã·ã§ã³ãã¹ã广çã«å©çšããããã«ã¯ãäž»èŠãªããããã£ãçè§£ããããšãäžå¯æ¬ ã§ãïŒ
offset-path
: ãã®ããããã£ã¯ãèŠçŽ ãç§»åãããã¹ãå®çŸ©ããŸããããã€ãã®å€ãåãå ¥ããããšãã§ããŸãïŒurl()
: HTMLå ãŸãã¯å€éšSVGãã¡ã€ã«ã§å®çŸ©ãããSVGãã¹èŠçŽ ãåç §ããŸããpath()
: CSSå ã§SVGãã¹æ§æã䜿çšããŠçŽæ¥ãã¹ãå®çŸ©ã§ããŸããray()
: (å®éšç) çŽç·ãã¹ãäœæããŸããnone
: ã¢ãŒã·ã§ã³ãã¹ã¢ãã¡ãŒã·ã§ã³ãç¡å¹ã«ããŸããoffset-distance
: ãã®ããããã£ã¯ãoffset-path
ã«æ²¿ã£ãèŠçŽ ã®äœçœ®ã決å®ããŸããå€ã¯0%
ãã100%
ã®ç¯å²ã§ããããããã¹ã®éå§ãšçµäºã衚ããŸããããŒã»ã³ããŒãžãé·ãïŒpxãemãªã©ïŒããŸãã¯èšç®å€ã䜿çšã§ããŸããoffset-rotate
: ãã®ããããã£ã¯ãèŠçŽ ããã¹ã«æ²¿ã£ãŠç§»åããéã®åããå¶åŸ¡ããŸãã以äžã®å€ãåãå ¥ããããšãã§ããŸãïŒauto
: èŠçŽ ã¯ãã¹ã®æ¥ç·ã«åãããŠèªåçã«å転ããŸããauto <angle>
:auto
ãšåæ§ã§ããã远å ã®å転è§åºŠãå ããŸãã<angle>
: èŠçŽ ã®åºå®å転è§åºŠãæå®ããŸããmotion-offset
: (ã·ã§ãŒããã³ã)offset-path
ãšoffset-distance
ãçµã¿åãããã·ã§ãŒããã³ãããããã£ã§ããmotion-rotation
: (ã·ã§ãŒããã³ã)offset-rotate
ãä»ã®transformããããã£ãšçµã¿åãããã·ã§ãŒããã³ãããããã£ã§ãã
å®è·µçãªäŸ
äŸ1ïŒSVGãã¹ã«æ²¿ã£ãŠèŠçŽ ãã¢ãã¡ãŒã·ã§ã³ããã
ãã®äŸã§ã¯ãå®çŸ©æžã¿ã®SVGãã¹ã«æ²¿ã£ãŠHTMLèŠçŽ ãåããæ¹æ³ã瀺ããŸãã
HTML:
<svg width="500" height="200">
<path id="myPath" d="M50,100 C150,20 350,180 450,100" fill="none" stroke="black"/>
</svg>
<div id="myElement">Element</div>
CSS:
#myElement {
width: 50px;
height: 50px;
background-color: dodgerblue;
position: absolute; /* Required for motion path to work */
offset-path: url(#myPath);
animation: moveAlongPath 5s linear infinite;
}
@keyframes moveAlongPath {
0% {
offset-distance: 0%;
}
100% {
offset-distance: 100%;
}
}
ãã®äŸã§ã¯ãIDããmyPathãã®SVGãã¹ãå®çŸ©ãããŠããŸãããmyElementãdivã®offset-path
ããããã£ãurl(#myPath)
ã«èšå®ãããSVGãã¹ã«ãªã³ã¯ãããŸããanimation
ããããã£ã¯ããmoveAlongPathããšããååã®ã¢ãã¡ãŒã·ã§ã³ãé©çšãã5ç§ãããŠoffset-distance
ã0%ãã100%ã«å€åãããé£ç¶çãªã¢ãã¡ãŒã·ã§ã³ã«ãŒããäœæããŸãã
äŸ2ïŒpath()
颿°ã䜿çšãã
ãã®äŸã§ã¯ãpath()
颿°ã䜿çšããŠCSSå
ã§çŽæ¥ãã¹ãå®çŸ©ããæ¹æ³ã瀺ããŸãã
HTML:
<div id="myElement2">Element 2</div>
CSS:
#myElement2 {
width: 50px;
height: 50px;
background-color: orange;
position: absolute;
offset-path: path("M50,50 C150,20 350,180 450,50");
animation: moveAlongPath2 5s linear infinite;
}
@keyframes moveAlongPath2 {
0% {
offset-distance: 0%;
}
100% {
offset-distance: 100%;
}
}
ããã§ã¯ãoffset-path
ãåã®äŸãšåãSVGãã¹ããŒã¿ãæã€path()
颿°ã䜿çšããŠçŽæ¥å®çŸ©ãããŠããŸããã³ãŒãã®æ®ãã®éšåã¯åæ§ã§ãåãã¢ãã¡ãŒã·ã§ã³å¹æãåŸãããŸãã
äŸ3ïŒoffset-rotate
ã§å転ãå¶åŸ¡ãã
ãã®äŸã§ã¯ãoffset-rotate
ããããã£ã䜿çšããŠãèŠçŽ ããã¹ã«æ²¿ã£ãŠç§»åããéã®åããå¶åŸ¡ããæ¹æ³ã瀺ããŸãã
HTML:
<svg width="500" height="200">
<path id="myPath3" d="M50,100 C150,20 350,180 450,100" fill="none" stroke="black"/>
</svg>
<div id="myElement3">Element 3</div>
CSS:
#myElement3 {
width: 50px;
height: 50px;
background-color: lightgreen;
position: absolute;
offset-path: url(#myPath3);
offset-rotate: auto; /* Element rotates to align with the path */
animation: moveAlongPath3 5s linear infinite;
}
@keyframes moveAlongPath3 {
0% {
offset-distance: 0%;
}
100% {
offset-distance: 100%;
}
}
offset-rotate: auto
ãèšå®ããããšã«ãããèŠçŽ ã¯åç¹ã§ãã¹ã®æ¥ç·ã«åãããŠèªåçã«å転ããããèªç¶ã§ãã€ãããã¯ãªã¢ãã¡ãŒã·ã§ã³ãäœæãããŸãã
ãŠãŒã¹ã±ãŒã¹ãšå¿çšäŸ
CSSã¢ãŒã·ã§ã³ãã¹ã¯ãWebéçºã«ãããŠä»¥äžã®ãããªå¹ åºãå¿çšãå¯èœã§ãïŒ
- é åçãªããŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ã®äœæïŒ åçŽãªã¹ãããŒã®ä»£ããã«ãã¢ãŒã·ã§ã³ãã¹ã䜿çšããŠã«ã¹ã¿ã ãã¹ã«æ²¿ã£ãŠèŠçŽ ãã¢ãã¡ãŒã·ã§ã³ãããããŒãã£ã³ã°ã®é²æãããèŠèŠçã«é åçãªæ¹æ³ã§ç€ºããŸããäŸãã°ãæ²ç·ãã¹ããã©ãããã°ã¬ã¹ããŒããããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã®åšããåãã¢ã€ã³ã³ãªã©ã§ãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹èŠçŽ ã®åŒ·åïŒ UIèŠçŽ ããã¹ã«æ²¿ã£ãŠã¢ãã¡ãŒã·ã§ã³ããããŠãŒã¶ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«å¯Ÿãããã£ãŒãããã¯ãæäŸããããããã»ã¹ãéããŠãŠãŒã¶ãŒãã¬ã€ããããããŸããäŸãã°ãæ²ç·ãã¹ã«æ²¿ã£ãŠã¹ã©ã€ãã€ã³ããéç¥ããå圢ãã¹ã«æ²¿ã£ãŠå±éããã¡ãã¥ãŒé ç®ãªã©ã§ãã
- ã€ã³ã¿ã©ã¯ãã£ããªã€ã³ãã©ã°ã©ãã£ãã¯ã®äœæïŒ ã¢ãŒã·ã§ã³ãã¹ã䜿çšããŠããŒã¿ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ãã¢ãã¡ãŒã·ã§ã³åããåããéããŠç©èªãäŒããã€ã³ã¿ã©ã¯ãã£ããªã€ã³ãã©ã°ã©ãã£ãã¯ãäœæããŸããäŸãã°ãã°ã©ãäžã®ç·ãã¢ãã¡ãŒã·ã§ã³ãããŠçµæçãªãã¬ã³ãã瀺ããããå°å³äžã®èŠçŽ ãåãããŠå°çããŒã¿ã説æãããããŸãã
- æ²¡å ¥æã®ãããŠã§ããµã€ãããã²ãŒã·ã§ã³ã®æ§ç¯ïŒ ã¢ãŒã·ã§ã³ãã¹ãå®è£ ããŠããŠããŒã¯ã§é åçãªããã²ãŒã·ã§ã³äœéšãåµé ããŸããäŸãã°ãã¡ãã¥ãŒé ç®ãæ²ç·ãã¹ã«æ²¿ã£ãŠã¢ãã¡ãŒã·ã§ã³ãããããç°ãªããã¹ã«æ²¿ã£ãŠç°ãªãé床ã§èŠçŽ ãåãããŠãã©ã©ãã¯ã¹å¹æãäœæãããããŸãã
- ãŠã§ããã¶ã€ã³ã«èžè¡çãªã»ã³ã¹ãå ããïŒ ã¢ãŒã·ã§ã³ãã¹ãå©çšããŠããŠã§ããµã€ãã®èŠèŠçé åãé«ããçŽç²ã«çŸçãªã¢ãã¡ãŒã·ã§ã³ãäœæããŸããäŸãã°ãè€éãªãã¹ã«æ²¿ã£ãŠæœè±¡çãªåœ¢ç¶ãã¢ãã¡ãŒã·ã§ã³ãããŠãã€ãããã¯ãªèæ¯ãäœæããããã€ã©ã¹ãã«åŸ®åŠãªåããå ãããããŸãã
- ã²ãŒã éçºïŒ ãã£ã©ã¯ã¿ãŒãçºå°ç©ããã®ä»ã®ã²ãŒã èŠçŽ ããå®çŸ©æžã¿ãŸãã¯åçã«çæããããã¹ã«æ²¿ã£ãŠã¢ãã¡ãŒã·ã§ã³ãããŸããããã¯ãåçŽãªãã©ãããã©ãŒããŒã®åãããè€éãªç©ºäžæ©åãŸã§ããããããã®ã«äœ¿çšã§ããŸãã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
CSSã¢ãŒã·ã§ã³ãã¹ã¯ãŠã§ããµã€ãã®èŠèŠçé åãé«ããããšãã§ããŸããããã¹ãŠã®ãŠãŒã¶ãŒãã³ã³ãã³ãã«ã¢ã¯ã»ã¹ãçè§£ã§ããããã«ãã¢ã¯ã»ã·ããªãã£ãèæ ®ããããšãäžå¯æ¬ ã§ãã以äžã«ããã€ãã®äž»èŠãªèæ ®äºé ãæããŸãïŒ
- 代æ¿ã³ã³ãã³ãã®æäŸïŒ ã¢ãã¡ãŒã·ã§ã³ãéèŠãªæ å ±ãäŒããŠããå Žåã¯ãã¢ãã¡ãŒã·ã§ã³ãèŠããæäœãããã§ããªããŠãŒã¶ãŒã®ããã«ã代æ¿ã®ããã¹ã説æãéçãªããŒãžã§ã³ã®ã³ã³ãã³ããæäŸããŸãã
- ã¢ãã¡ãŒã·ã§ã³é床ã®å¶åŸ¡ïŒ é«éãŸãã¯è€éãªã¢ãã¡ãŒã·ã§ã³ã¯äžéšã®ãŠãŒã¶ãŒã«ãšã£ãŠæ³šææ£æŒ«ã«ãªã£ãããæ¹åæèŠã倱ããããããå¯èœæ§ãããããããŠãŒã¶ãŒãã¢ãã¡ãŒã·ã§ã³ã®é床ãå¶åŸ¡ããããå®å
šã«äžæåæ¢ãããã§ããããã«ããŸããCSSã¯çŸåšããŠãŒã¶ãŒã®å¥œã¿ãæ€åºããããã®
prefers-reduced-motion
ã¡ãã£ã¢ã¯ãšãªãæäŸããŠããŸãã - ç¹æ» ããã¢ãã¡ãŒã·ã§ã³ãé¿ããïŒ ç¹æ» ããã¢ãã¡ãŒã·ã§ã³ã¯ãå éææ§ãŠããããæã€ãŠãŒã¶ãŒã®çºäœãåŒãèµ·ããå¯èœæ§ãããããã䜿çšãé¿ããŠãã ããã
- ååãªã³ã³ãã©ã¹ãã確ä¿ããïŒ ã¢ãã¡ãŒã·ã§ã³èŠçŽ ãšèæ¯ãšã®ã³ã³ãã©ã¹ãããèŠèŠé害ã®ãããŠãŒã¶ãŒã«ãšã£ãŠååã§ããããšã確èªããŠãã ããã
- æ¯æŽæè¡ã§ã®ãã¹ãïŒ ã¹ã¯ãªãŒã³ãªãŒããŒãªã©ã®æ¯æŽæè¡ã§ãŠã§ããµã€ãããã¹ãããã¢ãã¡ãŒã·ã§ã³ãã¢ã¯ã»ã¹å¯èœã§çè§£ããããããšã確èªããŠãã ããã
ããã©ãŒãã³ã¹ã®æé©å
ã¢ãã¡ãŒã·ã§ã³ã¯ãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããããã¹ã ãŒãºã§å¹ççãªã¬ã³ããªã³ã°ã®ããã«CSSã¢ãŒã·ã§ã³ãã¹ã¢ãã¡ãŒã·ã§ã³ãæé©åããããšãéèŠã§ãã以äžã«ããã€ãã®ãã³ãã瀺ããŸãïŒ
- ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®äœ¿çšïŒ
transform: translateZ(0)
ãbackface-visibility: hidden
ãªã©ã®CSSããããã£ãå©çšããŠããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãããªã¬ãŒããŸããããã«ãããã¢ãã¡ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžããŸãã - ãã¹ã®åçŽåïŒ å¶åŸ¡ç¹ãå°ãªãåçŽãªãã¹ã䜿çšããŠãã¬ã³ããªã³ã°ã®ãªãŒããŒããããåæžããŸãã
- SVGãã¡ã€ã«ã®æé©åïŒ SVGãã¹ã䜿çšããŠããå Žåã¯ãSVGãã¡ã€ã«ãæé©åããŠãµã€ãºãšè€éããåæžããŸãã
- 倿°ã®èŠçŽ ãåæã«ã¢ãã¡ãŒã·ã§ã³ãããªãïŒ å€æ°ã®èŠçŽ ãåæã«ã¢ãã¡ãŒã·ã§ã³ããããšããã©ãŠã¶ã®ãªãœãŒã¹ã«è² æ ããããå¯èœæ§ããããŸããèŠçŽ ããããã§ã¢ãã¡ãŒã·ã§ã³ãããããã¹ãã©ã€ãã·ãŒããªã©ã®æè¡ã䜿çšããããšãæ€èšããŠãã ããã
will-change
ããããã£ã®è³¢æãªäœ¿çšïŒwill-change
ããããã£ã¯ãä»åŸã®å€æŽããã©ãŠã¶ã«éç¥ããã¬ã³ããªã³ã°ãæé©åãããããšãã§ããŸãããã ãã䜿ãããããšããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸããã¢ã¯ãã£ãã«ã¢ãã¡ãŒã·ã§ã³ãããŠããèŠçŽ ã«ã®ã¿äœ¿çšããŠãã ããã- ã¢ãã¡ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°ïŒ ãã©ãŠã¶ã®éçºè ããŒã«ã䜿çšããŠã¢ãã¡ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
ãã©ãŠã¶ã®äºææ§
CSSã¢ãŒã·ã§ã³ãã¹ã¯ãChromeãFirefoxãSafariãEdgeãªã©ã®çŸä»£çãªãã©ãŠã¶ã§è¯å¥œãªãµããŒãã享åããŠããŸããããããå€ããã©ãŠã¶ã§ã¯ãã®æ©èœããµããŒããããŠããªãå Žåãããããããããã®ãŠãŒã¶ãŒã«ã¯ãã©ãŒã«ããã¯ã代æ¿ãœãªã¥ãŒã·ã§ã³ãæäŸããããšãéèŠã§ãã
Modernizrãªã©ã®æ©èœæ€åºæè¡ã䜿çšããŠããã©ãŠã¶ãCSSã¢ãŒã·ã§ã³ãã¹ããµããŒãããŠãããã©ããã確èªããããã«å¿ããŠä»£æ¿ã³ã³ãã³ããæ©èœãæäŸããããšãã§ããŸãã
çµè«
CSSã¢ãŒã·ã§ã³ãã¹ã¯ããŠã§ãäžã§è€éã§èŠèŠçã«çŸããã¢ãã¡ãŒã·ã§ã³ãäœæããããã®åŒ·åãªããŒã«ã§ããäž»èŠãªããããã£ãçè§£ããå®è·µçãªäŸãæ¢æ±ããã¢ã¯ã»ã·ããªãã£ãšããã©ãŒãã³ã¹ãèæ ®ããããšã§ãéçºè ã¯ã¢ãŒã·ã§ã³ãã¹ã®å¯èœæ§ãæå€§éã«åŒãåºããé åçã§ãã€ãããã¯ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåµåºã§ããŸãããŠã§ãæè¡ãé²åãç¶ããäžã§ãCSSã¢ãŒã·ã§ã³ãã¹ã¯ééããªããŠã§ãã¢ãã¡ãŒã·ã§ã³ã®æªæ¥ã圢äœãäžã§ãŸããŸãéèŠãªåœ¹å²ãæããã§ãããã
ããŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ã®äœæãUIèŠçŽ ã®åŒ·åãæ²¡å ¥æã®ãããŠã§ããµã€ãããã²ãŒã·ã§ã³ã®æ§ç¯ãªã©ãã©ã®ãããªå Žåã§ããCSSã¢ãŒã·ã§ã³ãã¹ã¯ãŠã§ããã¶ã€ã³ã«åœãå¹ã蟌ãããã®å€ç®çã§åµé çãªæ¹æ³ãæäŸããŸããããŸããŸãªãã¹ãå転æè¡ãã¢ãã¡ãŒã·ã§ã³ã®ã¿ã€ãã³ã°ã詊ããŠããã®ãšããµã€ãã£ã³ã°ãªæ©èœã®ç¡éã®å¯èœæ§ãçºèŠããŠãã ããã
ãããªãåŠç¿ãªãœãŒã¹
- MDN Web Docs: offset-path
- CSS-Tricks: offset-path
- GreenSock (GSAP): GSAPã¯JavaScriptã¢ãã¡ãŒã·ã§ã³ã©ã€ãã©ãªã§ãããå ç¢ãªã¢ãŒã·ã§ã³ãã¹æ©èœãæäŸããŠãããããé«åºŠãªå¶åŸ¡ãå¿ èŠãªãããžã§ã¯ãã«ãšã£ãŠè²Žéãªä»£æ¿ææ®µãšãªãåŸãŸãã